// Triangle.cpp
#include "Triangle.hpp"
#include <algorithm>
#include <array>

// 默认构造函数
Triangle::Triangle() {
    // 初始化三角形三个顶点的齐次坐标
    v[0] << 0,0,0,1;
    v[1] << 0,0,0,1;
    v[2] << 0,0,0,1;

    color[0] << 0.0, 0.0, 0.0;
    color[1] << 0.0, 0.0, 0.0;
    color[2] << 0.0, 0.0, 0.0;

    tex_coords[0] << 0.0, 0.0;
    tex_coords[1] << 0.0, 0.0;
    tex_coords[2] << 0.0, 0.0;
}

void Triangle::setVertex(int ind, Vector4f ver){
    v[ind] = ver;
}
void Triangle::setNormal(int ind, Vector3f n){
    normal[ind] = n;
}
void Triangle::setColor(int ind, float r, float g, float b){
    if (
        (r<0.0) || (r>255.) ||
        (g<0.0) || (g>255.) ||
        (b<0.0) || (b>255.)
    ) {
        fprintf(stderr, "ERROR! Invalid color values");
        fflush(stderr);
        exit(-1);
    }

    color[ind] = Vector3f( (float)r/255., (float)g/255., (float)b/255. );
    return;
}
void Triangle::setTexCoord(int ind, Vector2f uv){
    tex_coords[ind] = uv;
}

std::array<Vector4f, 3> Triangle::toVector4() const {
    //res是一个容器，类型是array，array的长度是3，元素类型是Vector4f
    std::array<Vector4f, 3> res;
    // 将三角形的三个顶点的坐标转换为Vector4f类型， 并将结果储存在res中
    std::transform(
        std::begin(v), std::end(v), res.begin(),
        // 直接复制前三个分量xyz，然后w设置为1
        [](auto& vec) { return Vector4f(vec.x(), vec.y(), vec.z(), 1.f); }
    );
    return res;
}

//设置法向量
void Triangle::setNormals(const std::array<Vector3f, 3>& normals){
    normal[0] = normals[0];
    normal[1] = normals[1]; 
    normal[2] = normals[2];
}


